<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="lhdaA" id="lhdaA"><span data-lake-id="u63b7cff5" id="u63b7cff5">典型回答</span></h1>
  <p data-lake-id="u34457eaf" id="u34457eaf"><br></p>
  <p data-lake-id="ub0a9753a" id="ub0a9753a"><br></p>
  <p data-lake-id="uc88b5f73" id="uc88b5f73"><span data-lake-id="ufbac5a81" id="ufbac5a81">在JDK 1.7中，引入了偏向锁的概念来优化synchronized的性能，但是偏向锁，在JDK 15中已经被废弃了。那么，为什么呢？（</span><a href="https://openjdk.org/jeps/374" target="_blank" data-lake-id="u0eaa0ae3" id="u0eaa0ae3"><span data-lake-id="u1d87b92e" id="u1d87b92e">https://openjdk.org/jeps/374</span></a><span data-lake-id="uc07eb7df" id="uc07eb7df"> ）</span></p>
  <p data-lake-id="uc062c0a8" id="uc062c0a8"><span data-lake-id="uce75c5ee" id="uce75c5ee">​</span><br></p>
  <p data-lake-id="u59728b18" id="u59728b18"><span data-lake-id="uc6e12ad3" id="uc6e12ad3">JDK 15决定废弃偏向锁的主要原因是：</span></p>
  <p data-lake-id="u378ce966" id="u378ce966"><span data-lake-id="ue7c59ca8" id="ue7c59ca8">​</span><br></p>
  <p data-lake-id="u283d19d1" id="u283d19d1"><span data-lake-id="ua969d444" id="ua969d444">在过去，Java 应用通常使用的都是 HashTable、Vector 等比较老的集合库，这类集合库大量使用了 synchronized 来保证线程安全。所以偏向锁技术作为synchronized的一种优化手段，可以减少无锁竞争情况下的开销，通过假定一个锁一直由同一线程拥有，从而避免执行比较和交换的原子操作。</span></p>
  <p data-lake-id="u851694e6" id="u851694e6"><span data-lake-id="uc576d3a9" id="uc576d3a9">​</span><br></p>
  <p data-lake-id="u4d40705f" id="u4d40705f"><span data-lake-id="u88a5aa06" id="u88a5aa06">但是，偏向锁的局限是当只有一个线程反复进入同步代码块时他才能快速获得，但是当有其他线程尝试获取锁的时候，就需要等到 safe point 时，再将偏向锁撤销为无锁的状态或者升级为轻量级锁，而这个过程其实是会消耗一定的性能的。</span></p>
  <p data-lake-id="uac6a5643" id="uac6a5643"><span data-lake-id="ub3e9793b" id="ub3e9793b">​</span><br></p>
  <p data-lake-id="ue3fad257" id="ue3fad257"><span data-lake-id="u10589193" id="u10589193">​</span><br></p>
  <p data-lake-id="ub69f60e8" id="ub69f60e8"><span data-lake-id="u063a934c" id="u063a934c">在高并发的场景下，频繁的撤销偏向锁和重新偏向不仅不能提升性能，还会导致性能下降，特别是在那些锁竞争较为激烈的应用中。</span></p>
  <p data-lake-id="u5ca959e0" id="u5ca959e0"><span data-lake-id="u159dadbf" id="u159dadbf">​</span><br></p>
  <p data-lake-id="u238fa165" id="u238fa165"><span data-lake-id="u27da5f65" id="u27da5f65">并且，随着Java应用程序的发展和优化，过去能够从偏向锁中获得的性能提升在当今的应用中不再明显。许多现代应用程序使用了不需要同步的集合类或更高性能的并发数据结构（如ConcurrentHashMap、CopyOnWriteArrayList等），而不再频繁地执行无争用的同步(synchronized)操作。</span></p>
  <p data-lake-id="uf7f6cc24" id="uf7f6cc24"><span data-lake-id="ua0dbb9b9" id="ua0dbb9b9">​</span><br></p>
  <p data-lake-id="u9c66ebe5" id="u9c66ebe5"><span data-lake-id="u6e837f52" id="u6e837f52">还有就是官方在文档中提到的，偏向锁的引入导致代码很复杂，给HotSpot虚拟机中锁相关部分与其他组件之间的交互也带来了复杂性。这种复杂性使得理解代码的各个部分变得困难，并且阻碍了在同步子系统内进行重大设计更改。因此，废弃偏向锁有助于减少复杂性，使代码更容易维护和改进。</span></p>
  <p data-lake-id="u17f36c28" id="u17f36c28"><br></p>
  <p data-lake-id="uee6db8d0" id="uee6db8d0"><strong><span data-lake-id="ub104c0e3" id="ub104c0e3">总之，废弃偏向锁是为了减少复杂性、提高代码可维护性，并鼓励开发人员采用更现代的并发编程技术，以适应当今Java应用程序的性能需求。</span></strong></p>
 </body>
</html>